# 作者： 李泉志
# 2025年01月08日21时57分秒
# 2947029073@qq.com

class Parent:
    def __init__(self, height):
        self.height = height


class Son1(Parent):
    def __init__(self, age, *args):
        self.age = age
        super().__init__(*args)


class Son2(Parent):
    def __init__(self, score, *args):
        self.score = score
        super().__init__(*args)


class GrandSon(Son1, Son2):
    def __init__(self, name, *args):
        self.name = name  # 自己处理name，剩下的参数归*args
        # 若有则走Son1的__init__方法，那么Son2的会走吗？
        # 答：也可以走到Son2的__init__方法,若还有参数会到Parent的__init__方法
        super().__init__(*args)


"""
Python 使用 C3 线性化算法来确定类的 MRO。对于 GrandSon 类来说，它的 MRO 是：
GrandSon -> Son1 -> Son2 -> Parent
这意味着：
当调用 GrandSon 的 super().__init__(*args) 时，它会先调用 Son1 的 __init__ 方法。
在 Son1 的 __init__ 方法中，再次调用 super().__init__(*args)，此时因为 MRO 的顺序，它会继续调用 Son2 的 __init__ 方法。
在 Son2 的 __init__ 方法中，super().__init__(*args) 最终会调用 Parent 的 __init__ 方法。
"""

"""
若想反过来让Parent处理第一个参数name，
Son1处理第二个参数age，Son2处理score，Grandson处理height
"""


class A:
    def __init__(self, name):
        self.name = name


class B(A):
    def __init__(self, name, age, score):
        super().__init__(name, age)
        self.score = score


class C(A):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age


class D(B, C):
    def __init__(self, name, age, score, height):
        super().__init__(name, age, score)
        self.height = height


"""
还可以直接传*args，每次获取args[-1],然后pop(),传给supre()
也可以用**kwargs，以字典传
class Parent:
    def __init__(self, **kwargs):
        self.name = kwargs.get('name')
        super().__init__()  # 不传递任何参数


class Son1(Parent):
    def __init__(self, **kwargs):
        self.age = kwargs.get('age')
        print(kwargs)
        super().__init__(**kwargs)  # 传递剩余的kwargs


class Son2(Parent):
    def __init__(self, **kwargs):
        self.score = kwargs.get('score')
        super().__init__(**kwargs)  # 传递剩余的kwargs


class GrandSon(Son1, Son2):
    def __init__(self, **kwargs):
        # kwargs.pop('height')
        super().__init__(**kwargs)  # 调用Son1和Son2的构造函数
        self.height = kwargs.get('height')


if __name__ == '__main__':
    xiaoming = GrandSon(name='小明', age=18, score=98.5, height=175)
    print(xiaoming.name)  # 输出: 小明
    print(xiaoming.age)   # 输出: 18
    print(xiaoming.score) # 输出: 98.5
    print(xiaoming.height) # 输出: 175
"""

if __name__ == '__main__':
    xiaoming = GrandSon('小明', 18, 98.5, 175)
    print(xiaoming.name)
    print(xiaoming.age)
    print(xiaoming.score)
    print(xiaoming.height)

    d = D('小红', 16, 85.5, 160)
    print(d.name)
    print(d.age)
    print(d.score)
    print(d.height)
